package com.ato.CommonClass.StringClass;

/**
 * @author wangjing
 * @create 2021--10--08--20:35
 */

/**
 * 异同： 底层都是 char[] value 只是可变不可变：final
 * String          不可变
 * <p>
 * StringBuffer    可变  JDK1.0  线程安全 弊端：同步方法，效率低
 * StringBuffer sb1  =    new StringBuffer();
 * 底层：char[] value = new char[16]; 默认给你一个16长度的char数组
 * sb1.append("a") ==>  value[0] = "a" ;  // 注意：该方法是没有返回值，因此会修改原数组！！！！
 * 问题1:System.out.println(sb1.length()); 此时 输入的依然是字符串实际长度。没有加上16
 * 问题2：扩容，当超过16个时，如何处理：append方法在添加之前先判断，一般是原来容量的2倍+2
 * <p>
 * <p>
 * StringBuffer sb1  =    new StringBuffer("abc");
 * 底层：char[] value = new char["abc".length()+16]; 输入字符串的长度再加上默认给你的16长度的char数组
 * <p>
 * 开发中 一般建议指定容量： new StringBuffer(int capacity)  避免再去扩容：扩容有一个复制的过程，影响性能
 * <p>
 * StringBuilder   可变  JDK5.0  线程不安全，好处：效率高了，没有synchronized 方法
 * 同上，只是这个不是  没有synchronized
 */
public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb1 = new StringBuffer();
//        System.out.println(sb1.length());

//        常用方法
        StringBuffer abc = sb1.append("abcdefg");
        System.out.println("StringBuffer append() 增加  " + abc);
        System.out.println("原字符串  " + sb1);


        StringBuffer delete = sb1.delete(0, 1);
        System.out.println("StringBuffer delete(int startIndex , int endIndex(不包含此索引)) 从索引删除，包含endIndex  " + delete);
        System.out.println("原字符串  " + sb1);

        StringBuffer aNew = sb1.replace(1, 3, "new");
        System.out.println(" StringBuffer replace(int startIndex , int endIndex(不包含此索引) , String str) 将指定索引内的替换成str ：不包含endIndex  " + aNew);
        System.out.println("原字符串  " + sb1);

        StringBuffer inset = sb1.insert(1, "inset");
        System.out.println(" StringBuffer insert(int  Index ,   String str) 将指定索引位置 ” 前 “的插入str  " + inset);
        System.out.println("原字符串  " + sb1);

        StringBuffer reverse = sb1.reverse();
        System.out.println(" StringBuffer reverse() 将字符串反转  " + reverse);
        System.out.println("原字符串  " + sb1);

        //  以上方法可链式调用： 返回是StringBuffer  那么StringBuffer这个类又可以调上面的方法。 ！！！！！！


        int g = sb1.indexOf("g");
        System.out.println("int indexOf(String str) 获取指定字符的索引  " + g);
        System.out.println("原字符串  " + sb1);

        String substring = sb1.substring(0, 2);
        // 不改变原数组！！！！ 返回一个新的String
        System.out.println(" String substring(int startIndex,int endIndex:不包含此索引) 获取指定索引区域内的字符串，不包含endIndex，不修改原数组返回String  " + substring);
        System.out.println("原字符串  " + sb1);

        System.out.println("int length() 返回字符串长度" + sb1.length());

        System.out.println("char charAt(int index) 返回指定索引处的字符  " + sb1.charAt(1));

        sb1.setCharAt(1, 'w'); //  注意这个没有返回值，修改字符串
        System.out.println("void setCharAt(int index , char ch) 设置指定索引处的字符为ch 注意点：ch类型为char，没有返回值，修改原字符串  " + sb1);

    }

}
